// 《围棋》作者版权所有。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

// go:build appengine 

// Package微妙实现的函数在加密
// 代码中经常有用，但需要仔细考虑才能正确使用。这是歌朗的一面镜子。org/x/crypto/internal/微妙。
package subtle // 导入“加密/内部/微妙”

// 这是基于reflect 
// 的谷歌应用引擎标准变体，因为不允许使用不安全的软件包和cgo。

import "reflect"

// AnyOverlap报告x和y是否在任何（不一定是
// 对应的）索引上共享内存。超过切片长度的内存将被忽略。
func AnyOverlap(x, y []byte) bool {
	return len(x) > 0 && len(y) > 0 &&
		reflect.ValueOf(&x[0]).Pointer() <= reflect.ValueOf(&y[len(y)-1]).Pointer() &&
		reflect.ValueOf(&y[0]).Pointer() <= reflect.ValueOf(&x[len(x)-1]).Pointer()
}

// IncactorVerlap报告x和y是否在任何不对应的
// 索引上共享内存。超过切片长度的内存将被忽略。请注意，x和y可以有不同的长度，但仍然没有任何不精确的重叠。
// 
// IncactorVerLap可用于实现加密/密码
// AEAD、块、块模式和流接口的要求。
func InexactOverlap(x, y []byte) bool {
	if len(x) == 0 || len(y) == 0 || &x[0] == &y[0] {
		return false
	}
	return AnyOverlap(x, y)
}
